package com.zhu.instructions.math;

// instructions/math/LSHL.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;

/**
 * 指令：lshl
 *
 * 操作数：无
 *
 * 功能：
 *  将栈顶的 long 值左移指定的位数：value1 << value2
 *
 * 栈变化：
 *      ..., value1(long), value2(int) → ..., result(long)
 *
 * 注意：
 *  - 位移量 value2 只取低 6 位（& 0x3f），因为 long 是 64 位
 *  - 例如：8L << 65 等价于 8L << 1 = 16L
 */
public class LSHL extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        int v2 = stack.popInt();     // 位移量（int）
        long v1 = stack.popLong();   // 被移动值（long）

        int s = v2 & 0x3f;           // 只取低6位（0~63）
        long result = v1 << s;
        stack.pushLong(result);
    }
}
